//
//  main.c
//  Arithmetic operator
//
//  Created by admin on 2019/7/8.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

#include <stdio.h>

/*
    1.如果参与算术表达式的操作数的类型都一致，那么算术表达式的结果的类型就是这个类型。
    例：TheSameOperand();
    10 / 4 ，这个数的操作类型都是int类型，所以表达式的结果为2，而不是2.5。
    所以正确的方式，应该使用int变量保存结果。
 
    要解决这个问题：
 1）改变任意一个操作数的类型，为double； 例：ChangeTheOperand();
 2）不改变操作数的类型，将操作数乘以1.0，把值变为double类型进行运算；例：NotChangeTheOperand();
 
    2.如果参与算术表达式的操作数类型不一致，那么算术表达式的结果的类型就是范围最大的那个类型。
      int < float < double
 
    3. % 求模运算符。
    1）实型数据无法参与求模运算，因为没有意义；
    2）m % n 的结果一定是在 0 -- (n-1) 之间。
 
 */


//算术表达式的类型一致的情况
void TheSameOperand(void);

//改变操作数的类型
void ChangeTheOperand(void);

//不改变操作数的类型
void NotChangeTheOperand(void);

int main(int argc, const char * argv[])
{
  
    NotChangeTheOperand();
    return 0;
}

//不改变操作数的类型
void NotChangeTheOperand(void)
{
    int num1 = 10,num2 = 4;

    double result = num1 * 1.0 / num2;
    
    //注意：此方法依然不行，因为执行顺序先运算了num1/num2的值为2，再运算乘以1.0；
    // double result = num1 / num2 * 1.0;
    
    //需要改写为：
    // double result = num1 / (num2 * 1.0 );
    
    printf("num1 / num2 = %lf\n",result);
    
}

//改变操作数的类型
void ChangeTheOperand(void)
{
    
    int num1 = 10;
    double num2 = 4;
    
    double result = num1 / num2;
    printf("num1 / num2 = %lf\n",result);
}

//算术表达式的类型一致的情况
void TheSameOperand()
{
    
    int num1 = 10,num2 = 4;
    
    //并没有效果，因为num1/num2本身的结果就为2。
    double result = num1 / num2;
    
    //输出结果为 2.000000 ，因为参与算术表达式的操作数类型都是一致的，故结果的类型也是这个类型。
    printf("num1 / num2 = %lf\n",result);
    
    
}
